Commit e9457165 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'usb-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6

* 'usb-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6:
  USB: EHCI: fix obscure race in ehci_endpoint_disable
  USB: gadget: AT91: fix typo in atmel_usba_udc driver
  USB: isp1362-hcd - fix section mismatch warning
  USB: EHCI: AMD periodic frame list table quirk
  USB: OTG: langwell_otg: fix up some sysfs attribute permissions
  USB: misc: usbsevseg: fix up some sysfs attribute permissions
  USB: misc: usbled: fix up some sysfs attribute permissions
  USB: misc: trancevibrator: fix up a sysfs attribute permission
  USB: misc: cypress_cy7c63: fix up some sysfs attribute permissions
  USB: storage: sierra_ms: fix sysfs file attribute
  USB: ehci: fix debugfs 'lpm' permissions
  USB: atm: ueagle-atm: fix up some permissions on the sysfs files
  xhci: Fix command ring replay after resume.
  xHCI: fix wMaxPacketSize mask
  xHCI: release spinlock when setup interrupt
  xhci: Remove excessive printks with shared IRQs.
parents 3561d43f 02e2c51b
...@@ -2301,7 +2301,7 @@ static ssize_t reboot(struct device *dev, struct device_attribute *attr, ...@@ -2301,7 +2301,7 @@ static ssize_t reboot(struct device *dev, struct device_attribute *attr,
return ret; return ret;
} }
static DEVICE_ATTR(stat_status, S_IWUGO | S_IRUGO, read_status, reboot); static DEVICE_ATTR(stat_status, S_IWUSR | S_IRUGO, read_status, reboot);
static ssize_t read_human_status(struct device *dev, static ssize_t read_human_status(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
...@@ -2364,8 +2364,7 @@ static ssize_t read_human_status(struct device *dev, ...@@ -2364,8 +2364,7 @@ static ssize_t read_human_status(struct device *dev,
return ret; return ret;
} }
static DEVICE_ATTR(stat_human_status, S_IWUGO | S_IRUGO, static DEVICE_ATTR(stat_human_status, S_IRUGO, read_human_status, NULL);
read_human_status, NULL);
static ssize_t read_delin(struct device *dev, struct device_attribute *attr, static ssize_t read_delin(struct device *dev, struct device_attribute *attr,
char *buf) char *buf)
...@@ -2397,7 +2396,7 @@ static ssize_t read_delin(struct device *dev, struct device_attribute *attr, ...@@ -2397,7 +2396,7 @@ static ssize_t read_delin(struct device *dev, struct device_attribute *attr,
return ret; return ret;
} }
static DEVICE_ATTR(stat_delin, S_IWUGO | S_IRUGO, read_delin, NULL); static DEVICE_ATTR(stat_delin, S_IRUGO, read_delin, NULL);
#define UEA_ATTR(name, reset) \ #define UEA_ATTR(name, reset) \
\ \
......
...@@ -2017,7 +2017,7 @@ static int __init usba_udc_probe(struct platform_device *pdev) ...@@ -2017,7 +2017,7 @@ static int __init usba_udc_probe(struct platform_device *pdev)
} }
} else { } else {
/* gpio_request fail so use -EINVAL for gpio_is_valid */ /* gpio_request fail so use -EINVAL for gpio_is_valid */
ubc->vbus_pin = -EINVAL; udc->vbus_pin = -EINVAL;
} }
} }
......
...@@ -1067,7 +1067,7 @@ static inline void create_debug_files (struct ehci_hcd *ehci) ...@@ -1067,7 +1067,7 @@ static inline void create_debug_files (struct ehci_hcd *ehci)
&debug_registers_fops)) &debug_registers_fops))
goto file_error; goto file_error;
if (!debugfs_create_file("lpm", S_IRUGO|S_IWUGO, ehci->debug_dir, bus, if (!debugfs_create_file("lpm", S_IRUGO|S_IWUSR, ehci->debug_dir, bus,
&debug_lpm_fops)) &debug_lpm_fops))
goto file_error; goto file_error;
......
...@@ -1063,10 +1063,11 @@ ehci_endpoint_disable (struct usb_hcd *hcd, struct usb_host_endpoint *ep) ...@@ -1063,10 +1063,11 @@ ehci_endpoint_disable (struct usb_hcd *hcd, struct usb_host_endpoint *ep)
tmp && tmp != qh; tmp && tmp != qh;
tmp = tmp->qh_next.qh) tmp = tmp->qh_next.qh)
continue; continue;
/* periodic qh self-unlinks on empty */ /* periodic qh self-unlinks on empty, and a COMPLETING qh
if (!tmp) * may already be unlinked.
goto nogood; */
unlink_async (ehci, qh); if (tmp)
unlink_async(ehci, qh);
/* FALL THROUGH */ /* FALL THROUGH */
case QH_STATE_UNLINK: /* wait for hw to finish? */ case QH_STATE_UNLINK: /* wait for hw to finish? */
case QH_STATE_UNLINK_WAIT: case QH_STATE_UNLINK_WAIT:
...@@ -1083,7 +1084,6 @@ ehci_endpoint_disable (struct usb_hcd *hcd, struct usb_host_endpoint *ep) ...@@ -1083,7 +1084,6 @@ ehci_endpoint_disable (struct usb_hcd *hcd, struct usb_host_endpoint *ep)
} }
/* else FALL THROUGH */ /* else FALL THROUGH */
default: default:
nogood:
/* caller was supposed to have unlinked any requests; /* caller was supposed to have unlinked any requests;
* that's not our job. just leak this memory. * that's not our job. just leak this memory.
*/ */
......
...@@ -141,6 +141,10 @@ static void ehci_mem_cleanup (struct ehci_hcd *ehci) ...@@ -141,6 +141,10 @@ static void ehci_mem_cleanup (struct ehci_hcd *ehci)
qh_put (ehci->async); qh_put (ehci->async);
ehci->async = NULL; ehci->async = NULL;
if (ehci->dummy)
qh_put(ehci->dummy);
ehci->dummy = NULL;
/* DMA consistent memory and pools */ /* DMA consistent memory and pools */
if (ehci->qtd_pool) if (ehci->qtd_pool)
dma_pool_destroy (ehci->qtd_pool); dma_pool_destroy (ehci->qtd_pool);
...@@ -227,8 +231,26 @@ static int ehci_mem_init (struct ehci_hcd *ehci, gfp_t flags) ...@@ -227,8 +231,26 @@ static int ehci_mem_init (struct ehci_hcd *ehci, gfp_t flags)
if (ehci->periodic == NULL) { if (ehci->periodic == NULL) {
goto fail; goto fail;
} }
if (ehci->use_dummy_qh) {
struct ehci_qh_hw *hw;
ehci->dummy = ehci_qh_alloc(ehci, flags);
if (!ehci->dummy)
goto fail;
hw = ehci->dummy->hw;
hw->hw_next = EHCI_LIST_END(ehci);
hw->hw_qtd_next = EHCI_LIST_END(ehci);
hw->hw_alt_next = EHCI_LIST_END(ehci);
hw->hw_token &= ~QTD_STS_ACTIVE;
ehci->dummy->hw = hw;
for (i = 0; i < ehci->periodic_size; i++)
ehci->periodic[i] = ehci->dummy->qh_dma;
} else {
for (i = 0; i < ehci->periodic_size; i++) for (i = 0; i < ehci->periodic_size; i++)
ehci->periodic [i] = EHCI_LIST_END(ehci); ehci->periodic[i] = EHCI_LIST_END(ehci);
}
/* software shadow of hardware table */ /* software shadow of hardware table */
ehci->pshadow = kcalloc(ehci->periodic_size, sizeof(void *), flags); ehci->pshadow = kcalloc(ehci->periodic_size, sizeof(void *), flags);
......
...@@ -103,6 +103,19 @@ static int ehci_pci_setup(struct usb_hcd *hcd) ...@@ -103,6 +103,19 @@ static int ehci_pci_setup(struct usb_hcd *hcd)
if (retval) if (retval)
return retval; return retval;
if ((pdev->vendor == PCI_VENDOR_ID_AMD && pdev->device == 0x7808) ||
(pdev->vendor == PCI_VENDOR_ID_ATI && pdev->device == 0x4396)) {
/* EHCI controller on AMD SB700/SB800/Hudson-2/3 platforms may
* read/write memory space which does not belong to it when
* there is NULL pointer with T-bit set to 1 in the frame list
* table. To avoid the issue, the frame list link pointer
* should always contain a valid pointer to a inactive qh.
*/
ehci->use_dummy_qh = 1;
ehci_info(ehci, "applying AMD SB700/SB800/Hudson-2/3 EHCI "
"dummy qh workaround\n");
}
/* data structure init */ /* data structure init */
retval = ehci_init(hcd); retval = ehci_init(hcd);
if (retval) if (retval)
......
...@@ -98,7 +98,14 @@ static void periodic_unlink (struct ehci_hcd *ehci, unsigned frame, void *ptr) ...@@ -98,7 +98,14 @@ static void periodic_unlink (struct ehci_hcd *ehci, unsigned frame, void *ptr)
*/ */
*prev_p = *periodic_next_shadow(ehci, &here, *prev_p = *periodic_next_shadow(ehci, &here,
Q_NEXT_TYPE(ehci, *hw_p)); Q_NEXT_TYPE(ehci, *hw_p));
*hw_p = *shadow_next_periodic(ehci, &here, Q_NEXT_TYPE(ehci, *hw_p));
if (!ehci->use_dummy_qh ||
*shadow_next_periodic(ehci, &here, Q_NEXT_TYPE(ehci, *hw_p))
!= EHCI_LIST_END(ehci))
*hw_p = *shadow_next_periodic(ehci, &here,
Q_NEXT_TYPE(ehci, *hw_p));
else
*hw_p = ehci->dummy->qh_dma;
} }
/* how many of the uframe's 125 usecs are allocated? */ /* how many of the uframe's 125 usecs are allocated? */
...@@ -2335,7 +2342,11 @@ scan_periodic (struct ehci_hcd *ehci) ...@@ -2335,7 +2342,11 @@ scan_periodic (struct ehci_hcd *ehci)
* pointer for much longer, if at all. * pointer for much longer, if at all.
*/ */
*q_p = q.itd->itd_next; *q_p = q.itd->itd_next;
if (!ehci->use_dummy_qh ||
q.itd->hw_next != EHCI_LIST_END(ehci))
*hw_p = q.itd->hw_next; *hw_p = q.itd->hw_next;
else
*hw_p = ehci->dummy->qh_dma;
type = Q_NEXT_TYPE(ehci, q.itd->hw_next); type = Q_NEXT_TYPE(ehci, q.itd->hw_next);
wmb(); wmb();
modified = itd_complete (ehci, q.itd); modified = itd_complete (ehci, q.itd);
...@@ -2368,7 +2379,11 @@ scan_periodic (struct ehci_hcd *ehci) ...@@ -2368,7 +2379,11 @@ scan_periodic (struct ehci_hcd *ehci)
* URB completion. * URB completion.
*/ */
*q_p = q.sitd->sitd_next; *q_p = q.sitd->sitd_next;
if (!ehci->use_dummy_qh ||
q.sitd->hw_next != EHCI_LIST_END(ehci))
*hw_p = q.sitd->hw_next; *hw_p = q.sitd->hw_next;
else
*hw_p = ehci->dummy->qh_dma;
type = Q_NEXT_TYPE(ehci, q.sitd->hw_next); type = Q_NEXT_TYPE(ehci, q.sitd->hw_next);
wmb(); wmb();
modified = sitd_complete (ehci, q.sitd); modified = sitd_complete (ehci, q.sitd);
......
...@@ -73,6 +73,7 @@ struct ehci_hcd { /* one per controller */ ...@@ -73,6 +73,7 @@ struct ehci_hcd { /* one per controller */
/* async schedule support */ /* async schedule support */
struct ehci_qh *async; struct ehci_qh *async;
struct ehci_qh *dummy; /* For AMD quirk use */
struct ehci_qh *reclaim; struct ehci_qh *reclaim;
unsigned scanning : 1; unsigned scanning : 1;
...@@ -131,6 +132,7 @@ struct ehci_hcd { /* one per controller */ ...@@ -131,6 +132,7 @@ struct ehci_hcd { /* one per controller */
unsigned need_io_watchdog:1; unsigned need_io_watchdog:1;
unsigned broken_periodic:1; unsigned broken_periodic:1;
unsigned fs_i_thresh:1; /* Intel iso scheduling */ unsigned fs_i_thresh:1; /* Intel iso scheduling */
unsigned use_dummy_qh:1; /* AMD Frame List table quirk*/
/* required for usb32 quirk */ /* required for usb32 quirk */
#define OHCI_CTRL_HCFS (3 << 6) #define OHCI_CTRL_HCFS (3 << 6)
......
...@@ -2683,7 +2683,7 @@ static int __devexit isp1362_remove(struct platform_device *pdev) ...@@ -2683,7 +2683,7 @@ static int __devexit isp1362_remove(struct platform_device *pdev)
return 0; return 0;
} }
static int __init isp1362_probe(struct platform_device *pdev) static int __devinit isp1362_probe(struct platform_device *pdev)
{ {
struct usb_hcd *hcd; struct usb_hcd *hcd;
struct isp1362_hcd *isp1362_hcd; struct isp1362_hcd *isp1362_hcd;
......
...@@ -1045,7 +1045,7 @@ static inline u32 xhci_get_max_esit_payload(struct xhci_hcd *xhci, ...@@ -1045,7 +1045,7 @@ static inline u32 xhci_get_max_esit_payload(struct xhci_hcd *xhci,
if (udev->speed == USB_SPEED_SUPER) if (udev->speed == USB_SPEED_SUPER)
return ep->ss_ep_comp.wBytesPerInterval; return ep->ss_ep_comp.wBytesPerInterval;
max_packet = ep->desc.wMaxPacketSize & 0x3ff; max_packet = GET_MAX_PACKET(ep->desc.wMaxPacketSize);
max_burst = (ep->desc.wMaxPacketSize & 0x1800) >> 11; max_burst = (ep->desc.wMaxPacketSize & 0x1800) >> 11;
/* A 0 in max burst means 1 transfer per ESIT */ /* A 0 in max burst means 1 transfer per ESIT */
return max_packet * (max_burst + 1); return max_packet * (max_burst + 1);
...@@ -1135,7 +1135,7 @@ int xhci_endpoint_init(struct xhci_hcd *xhci, ...@@ -1135,7 +1135,7 @@ int xhci_endpoint_init(struct xhci_hcd *xhci,
/* Fall through */ /* Fall through */
case USB_SPEED_FULL: case USB_SPEED_FULL:
case USB_SPEED_LOW: case USB_SPEED_LOW:
max_packet = ep->desc.wMaxPacketSize & 0x3ff; max_packet = GET_MAX_PACKET(ep->desc.wMaxPacketSize);
ep_ctx->ep_info2 |= MAX_PACKET(max_packet); ep_ctx->ep_info2 |= MAX_PACKET(max_packet);
break; break;
default: default:
......
...@@ -2104,7 +2104,6 @@ irqreturn_t xhci_irq(struct usb_hcd *hcd) ...@@ -2104,7 +2104,6 @@ irqreturn_t xhci_irq(struct usb_hcd *hcd)
if (!(status & STS_EINT)) { if (!(status & STS_EINT)) {
spin_unlock(&xhci->lock); spin_unlock(&xhci->lock);
xhci_warn(xhci, "Spurious interrupt.\n");
return IRQ_NONE; return IRQ_NONE;
} }
xhci_dbg(xhci, "op reg status = %08x\n", status); xhci_dbg(xhci, "op reg status = %08x\n", status);
......
...@@ -577,6 +577,65 @@ static void xhci_restore_registers(struct xhci_hcd *xhci) ...@@ -577,6 +577,65 @@ static void xhci_restore_registers(struct xhci_hcd *xhci)
xhci_write_64(xhci, xhci->s3.erst_base, &xhci->ir_set->erst_base); xhci_write_64(xhci, xhci->s3.erst_base, &xhci->ir_set->erst_base);
} }
static void xhci_set_cmd_ring_deq(struct xhci_hcd *xhci)
{
u64 val_64;
/* step 2: initialize command ring buffer */
val_64 = xhci_read_64(xhci, &xhci->op_regs->cmd_ring);
val_64 = (val_64 & (u64) CMD_RING_RSVD_BITS) |
(xhci_trb_virt_to_dma(xhci->cmd_ring->deq_seg,
xhci->cmd_ring->dequeue) &
(u64) ~CMD_RING_RSVD_BITS) |
xhci->cmd_ring->cycle_state;
xhci_dbg(xhci, "// Setting command ring address to 0x%llx\n",
(long unsigned long) val_64);
xhci_write_64(xhci, val_64, &xhci->op_regs->cmd_ring);
}
/*
* The whole command ring must be cleared to zero when we suspend the host.
*
* The host doesn't save the command ring pointer in the suspend well, so we
* need to re-program it on resume. Unfortunately, the pointer must be 64-byte
* aligned, because of the reserved bits in the command ring dequeue pointer
* register. Therefore, we can't just set the dequeue pointer back in the
* middle of the ring (TRBs are 16-byte aligned).
*/
static void xhci_clear_command_ring(struct xhci_hcd *xhci)
{
struct xhci_ring *ring;
struct xhci_segment *seg;
ring = xhci->cmd_ring;
seg = ring->deq_seg;
do {
memset(seg->trbs, 0, SEGMENT_SIZE);
seg = seg->next;
} while (seg != ring->deq_seg);
/* Reset the software enqueue and dequeue pointers */
ring->deq_seg = ring->first_seg;
ring->dequeue = ring->first_seg->trbs;
ring->enq_seg = ring->deq_seg;
ring->enqueue = ring->dequeue;
/*
* Ring is now zeroed, so the HW should look for change of ownership
* when the cycle bit is set to 1.
*/
ring->cycle_state = 1;
/*
* Reset the hardware dequeue pointer.
* Yes, this will need to be re-written after resume, but we're paranoid
* and want to make sure the hardware doesn't access bogus memory
* because, say, the BIOS or an SMI started the host without changing
* the command ring pointers.
*/
xhci_set_cmd_ring_deq(xhci);
}
/* /*
* Stop HC (not bus-specific) * Stop HC (not bus-specific)
* *
...@@ -604,6 +663,7 @@ int xhci_suspend(struct xhci_hcd *xhci) ...@@ -604,6 +663,7 @@ int xhci_suspend(struct xhci_hcd *xhci)
spin_unlock_irq(&xhci->lock); spin_unlock_irq(&xhci->lock);
return -ETIMEDOUT; return -ETIMEDOUT;
} }
xhci_clear_command_ring(xhci);
/* step 3: save registers */ /* step 3: save registers */
xhci_save_registers(xhci); xhci_save_registers(xhci);
...@@ -635,7 +695,6 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) ...@@ -635,7 +695,6 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
u32 command, temp = 0; u32 command, temp = 0;
struct usb_hcd *hcd = xhci_to_hcd(xhci); struct usb_hcd *hcd = xhci_to_hcd(xhci);
struct pci_dev *pdev = to_pci_dev(hcd->self.controller); struct pci_dev *pdev = to_pci_dev(hcd->self.controller);
u64 val_64;
int old_state, retval; int old_state, retval;
old_state = hcd->state; old_state = hcd->state;
...@@ -648,15 +707,7 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) ...@@ -648,15 +707,7 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
/* step 1: restore register */ /* step 1: restore register */
xhci_restore_registers(xhci); xhci_restore_registers(xhci);
/* step 2: initialize command ring buffer */ /* step 2: initialize command ring buffer */
val_64 = xhci_read_64(xhci, &xhci->op_regs->cmd_ring); xhci_set_cmd_ring_deq(xhci);
val_64 = (val_64 & (u64) CMD_RING_RSVD_BITS) |
(xhci_trb_virt_to_dma(xhci->cmd_ring->deq_seg,
xhci->cmd_ring->dequeue) &
(u64) ~CMD_RING_RSVD_BITS) |
xhci->cmd_ring->cycle_state;
xhci_dbg(xhci, "// Setting command ring address to 0x%llx\n",
(long unsigned long) val_64);
xhci_write_64(xhci, val_64, &xhci->op_regs->cmd_ring);
/* step 3: restore state and start state*/ /* step 3: restore state and start state*/
/* step 3: set CRS flag */ /* step 3: set CRS flag */
command = xhci_readl(xhci, &xhci->op_regs->command); command = xhci_readl(xhci, &xhci->op_regs->command);
...@@ -714,6 +765,7 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) ...@@ -714,6 +765,7 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
return retval; return retval;
} }
spin_unlock_irq(&xhci->lock);
/* Re-setup MSI-X */ /* Re-setup MSI-X */
if (hcd->irq) if (hcd->irq)
free_irq(hcd->irq, hcd); free_irq(hcd->irq, hcd);
...@@ -736,6 +788,7 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) ...@@ -736,6 +788,7 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
hcd->irq = pdev->irq; hcd->irq = pdev->irq;
} }
spin_lock_irq(&xhci->lock);
/* step 4: set Run/Stop bit */ /* step 4: set Run/Stop bit */
command = xhci_readl(xhci, &xhci->op_regs->command); command = xhci_readl(xhci, &xhci->op_regs->command);
command |= CMD_RUN; command |= CMD_RUN;
......
...@@ -621,6 +621,11 @@ struct xhci_ep_ctx { ...@@ -621,6 +621,11 @@ struct xhci_ep_ctx {
#define MAX_PACKET_MASK (0xffff << 16) #define MAX_PACKET_MASK (0xffff << 16)
#define MAX_PACKET_DECODED(p) (((p) >> 16) & 0xffff) #define MAX_PACKET_DECODED(p) (((p) >> 16) & 0xffff)
/* Get max packet size from ep desc. Bit 10..0 specify the max packet size.
* USB2.0 spec 9.6.6.
*/
#define GET_MAX_PACKET(p) ((p) & 0x7ff)
/* tx_info bitmasks */ /* tx_info bitmasks */
#define AVG_TRB_LENGTH_FOR_EP(p) ((p) & 0xffff) #define AVG_TRB_LENGTH_FOR_EP(p) ((p) & 0xffff)
#define MAX_ESIT_PAYLOAD_FOR_EP(p) (((p) & 0xffff) << 16) #define MAX_ESIT_PAYLOAD_FOR_EP(p) (((p) & 0xffff) << 16)
......
...@@ -196,11 +196,9 @@ static ssize_t get_port1_handler(struct device *dev, ...@@ -196,11 +196,9 @@ static ssize_t get_port1_handler(struct device *dev,
return read_port(dev, attr, buf, 1, CYPRESS_READ_PORT_ID1); return read_port(dev, attr, buf, 1, CYPRESS_READ_PORT_ID1);
} }
static DEVICE_ATTR(port0, S_IWUGO | S_IRUGO, static DEVICE_ATTR(port0, S_IRUGO | S_IWUSR, get_port0_handler, set_port0_handler);
get_port0_handler, set_port0_handler);
static DEVICE_ATTR(port1, S_IWUGO | S_IRUGO, static DEVICE_ATTR(port1, S_IRUGO | S_IWUSR, get_port1_handler, set_port1_handler);
get_port1_handler, set_port1_handler);
static int cypress_probe(struct usb_interface *interface, static int cypress_probe(struct usb_interface *interface,
......
...@@ -86,7 +86,7 @@ static ssize_t set_speed(struct device *dev, struct device_attribute *attr, ...@@ -86,7 +86,7 @@ static ssize_t set_speed(struct device *dev, struct device_attribute *attr,
return count; return count;
} }
static DEVICE_ATTR(speed, S_IWUGO | S_IRUGO, show_speed, set_speed); static DEVICE_ATTR(speed, S_IRUGO | S_IWUSR, show_speed, set_speed);
static int tv_probe(struct usb_interface *interface, static int tv_probe(struct usb_interface *interface,
const struct usb_device_id *id) const struct usb_device_id *id)
......
...@@ -94,7 +94,7 @@ static ssize_t set_##value(struct device *dev, struct device_attribute *attr, co ...@@ -94,7 +94,7 @@ static ssize_t set_##value(struct device *dev, struct device_attribute *attr, co
change_color(led); \ change_color(led); \
return count; \ return count; \
} \ } \
static DEVICE_ATTR(value, S_IWUGO | S_IRUGO, show_##value, set_##value); static DEVICE_ATTR(value, S_IRUGO | S_IWUSR, show_##value, set_##value);
show_set(blue); show_set(blue);
show_set(red); show_set(red);
show_set(green); show_set(green);
......
...@@ -192,7 +192,7 @@ static ssize_t set_attr_##name(struct device *dev, \ ...@@ -192,7 +192,7 @@ static ssize_t set_attr_##name(struct device *dev, \
\ \
return count; \ return count; \
} \ } \
static DEVICE_ATTR(name, S_IWUGO | S_IRUGO, show_attr_##name, set_attr_##name); static DEVICE_ATTR(name, S_IRUGO | S_IWUSR, show_attr_##name, set_attr_##name);
static ssize_t show_attr_text(struct device *dev, static ssize_t show_attr_text(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
...@@ -223,7 +223,7 @@ static ssize_t set_attr_text(struct device *dev, ...@@ -223,7 +223,7 @@ static ssize_t set_attr_text(struct device *dev,
return count; return count;
} }
static DEVICE_ATTR(text, S_IWUGO | S_IRUGO, show_attr_text, set_attr_text); static DEVICE_ATTR(text, S_IRUGO | S_IWUSR, show_attr_text, set_attr_text);
static ssize_t show_attr_decimals(struct device *dev, static ssize_t show_attr_decimals(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
...@@ -272,8 +272,7 @@ static ssize_t set_attr_decimals(struct device *dev, ...@@ -272,8 +272,7 @@ static ssize_t set_attr_decimals(struct device *dev,
return count; return count;
} }
static DEVICE_ATTR(decimals, S_IWUGO | S_IRUGO, static DEVICE_ATTR(decimals, S_IRUGO | S_IWUSR, show_attr_decimals, set_attr_decimals);
show_attr_decimals, set_attr_decimals);
static ssize_t show_attr_textmode(struct device *dev, static ssize_t show_attr_textmode(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
...@@ -319,8 +318,7 @@ static ssize_t set_attr_textmode(struct device *dev, ...@@ -319,8 +318,7 @@ static ssize_t set_attr_textmode(struct device *dev,
return -EINVAL; return -EINVAL;
} }
static DEVICE_ATTR(textmode, S_IWUGO | S_IRUGO, static DEVICE_ATTR(textmode, S_IRUGO | S_IWUSR, show_attr_textmode, set_attr_textmode);
show_attr_textmode, set_attr_textmode);
MYDEV_ATTR_SIMPLE_UNSIGNED(powered, update_display_powered); MYDEV_ATTR_SIMPLE_UNSIGNED(powered, update_display_powered);
......
...@@ -1896,7 +1896,7 @@ set_a_bus_req(struct device *dev, struct device_attribute *attr, ...@@ -1896,7 +1896,7 @@ set_a_bus_req(struct device *dev, struct device_attribute *attr,
} }
return count; return count;
} }
static DEVICE_ATTR(a_bus_req, S_IRUGO | S_IWUGO, get_a_bus_req, set_a_bus_req); static DEVICE_ATTR(a_bus_req, S_IRUGO | S_IWUSR, get_a_bus_req, set_a_bus_req);
static ssize_t static ssize_t
get_a_bus_drop(struct device *dev, struct device_attribute *attr, char *buf) get_a_bus_drop(struct device *dev, struct device_attribute *attr, char *buf)
...@@ -1942,8 +1942,7 @@ set_a_bus_drop(struct device *dev, struct device_attribute *attr, ...@@ -1942,8 +1942,7 @@ set_a_bus_drop(struct device *dev, struct device_attribute *attr,
} }
return count; return count;
} }
static DEVICE_ATTR(a_bus_drop, S_IRUGO | S_IWUGO, static DEVICE_ATTR(a_bus_drop, S_IRUGO | S_IWUSR, get_a_bus_drop, set_a_bus_drop);
get_a_bus_drop, set_a_bus_drop);
static ssize_t static ssize_t
get_b_bus_req(struct device *dev, struct device_attribute *attr, char *buf) get_b_bus_req(struct device *dev, struct device_attribute *attr, char *buf)
...@@ -1988,7 +1987,7 @@ set_b_bus_req(struct device *dev, struct device_attribute *attr, ...@@ -1988,7 +1987,7 @@ set_b_bus_req(struct device *dev, struct device_attribute *attr,
} }
return count; return count;
} }
static DEVICE_ATTR(b_bus_req, S_IRUGO | S_IWUGO, get_b_bus_req, set_b_bus_req); static DEVICE_ATTR(b_bus_req, S_IRUGO | S_IWUSR, get_b_bus_req, set_b_bus_req);
static ssize_t static ssize_t
set_a_clr_err(struct device *dev, struct device_attribute *attr, set_a_clr_err(struct device *dev, struct device_attribute *attr,
...@@ -2012,7 +2011,7 @@ set_a_clr_err(struct device *dev, struct device_attribute *attr, ...@@ -2012,7 +2011,7 @@ set_a_clr_err(struct device *dev, struct device_attribute *attr,
} }
return count; return count;
} }
static DEVICE_ATTR(a_clr_err, S_IWUGO, NULL, set_a_clr_err); static DEVICE_ATTR(a_clr_err, S_IWUSR, NULL, set_a_clr_err);
static struct attribute *inputs_attrs[] = { static struct attribute *inputs_attrs[] = {
&dev_attr_a_bus_req.attr, &dev_attr_a_bus_req.attr,
......
...@@ -121,7 +121,7 @@ static ssize_t show_truinst(struct device *dev, struct device_attribute *attr, ...@@ -121,7 +121,7 @@ static ssize_t show_truinst(struct device *dev, struct device_attribute *attr,
} }
return result; return result;
} }
static DEVICE_ATTR(truinst, S_IWUGO | S_IRUGO, show_truinst, NULL); static DEVICE_ATTR(truinst, S_IRUGO, show_truinst, NULL);
int sierra_ms_init(struct us_data *us) int sierra_ms_init(struct us_data *us)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment